// 不能使用标准库，标准库会依赖操作系统
#![no_std]  // 不链接Rust标准库

// 运行时库crt0会调用main函数
// 运行时库页依赖操作系统，因此不需要main，需要自己定义一个入口点
#![no_main] // 禁用所有Rust层级的入口点

pub mod system;
pub mod process;
pub mod tty;

use core::panic::PanicInfo;
// 这个函数将在panic时被调用
#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {
    loop {}
}

extern "C" {
    pub fn print_str_endwith_enter(p : *const u8, l : u32);
    fn swtich_to_task();
}

// 定义入口地址，并保持kernel_start这个命名
// 默认命名为`kernel_start`
#[no_mangle] // 不重整函数名
pub extern "C" fn kernel_start() -> ! {
    print_welcome();
    system_init();
    
    unsafe {
        let _dispstr = "KERNEL init OK!";
        print_str_endwith_enter(_dispstr.as_ptr(), _dispstr.len().try_into().unwrap());
    }
    loop {}
}

fn print_welcome() {
    unsafe {
        let _dispstr = "Welcome to RuixOS!";
        print_str_endwith_enter(_dispstr.as_ptr(), _dispstr.len().try_into().unwrap());
    }
}

use system::gdt;
use system::idt;
use system::paging;
use process::task;
// 初始化gdt idt 分页
fn system_init() {
    gdt::gdt_init();
    paging::paging_init();
    idt::idt_init();

    // 任务初始化
    task::task_init();
    unsafe {
        swtich_to_task(); // 切换到第一个任务ring0 -> ring3
    }
}